package com.shiyanlou.upms.common.config;
import org.springframework.core.convert.converter.Converter;
import org.springframework.stereotype.Component;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * 日期类
 * 提交的表单信息中包含日期格式时，系统会自动将字符串类型转化为 java 日期类型
 */

@Component
public class DateConverterConfig implements Converter<String, Date> {

    private static final List<String> formarts = new ArrayList<>(4);
    static {
        formarts.add("yyyy-MM");
        formarts.add("yyyy-MM-dd");
        formarts.add("yyyy-MM-dd hh:mm");
        formarts.add("yyyy-MM-dd hh:mm:ss");
    }

    @Override
    public Date convert(String source) {
        String value = source.trim();
        /*trim() 方法是 Java 字符串类 String 的一个方法，用于去除字符串两端的空格或空白字符。
        在调用 trim() 方法时，它会返回一个新的字符串，该字符串是去除了原始字符串两端空格或空白字符后的结果。*/
        if ("".equals(value)) {
            return null;
        }
        /*matches() 方法是 Java 字符串类 String 的一个方法，用于判断字符串是否匹配指定的正则表达式。
        在调用 matches() 方法时，它会将字符串与给定的正则表达式进行匹配，并返回一个布尔值表示匹配结果。
        如果字符串与正则表达式完全匹配，则返回 true，否则返回 false。*/
        if (source.matches("^\\d{4}-\\d{1,2}$")) {
            return parseDate(source, formarts.get(0));
        } else if (source.matches("^\\d{4}-\\d{1,2}-\\d{1,2}$")) {
            return parseDate(source, formarts.get(1));
        } else if (source.matches("^\\d{4}-\\d{1,2}-\\d{1,2} {1}\\d{1,2}:\\d{1,2}$")) {
            return parseDate(source, formarts.get(2));
        } else if (source.matches("^\\d{4}-\\d{1,2}-\\d{1,2} {1}\\d{1,2}:\\d{1,2}:\\d{1,2}$")) {
            return parseDate(source, formarts.get(3));
        } else {
            throw new IllegalArgumentException("Invalid boolean value '" + source + "'");
        }
    }

    /**
     * 格式化日期
     *
     * @param dateStr String 字符型日期
     * @param format  String 格式
     * @return Date 日期
     */
    //parseDate() 是一个方法，用于解析日期字符串并返回一个 Date 对象。
    public Date parseDate(String dateStr, String format) {
        Date date = null;
        try {
            DateFormat dateFormat = new SimpleDateFormat(format);
            date = dateFormat.parse(dateStr);
        } catch (Exception e) {
            throw new IllegalArgumentException("Invalid boolean value ");
        }
        return date;
    }
}